home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / ld / dist / patch2 / ld.c.rej < prev    next >
Encoding:
Text File  |  1990-10-26  |  48.5 KB  |  1,713 lines

  1. ***************
  2. *** 27,37 ****
  3.   #include <fcntl.h>
  4.   #endif
  5.   
  6.   #ifdef COFF_ENCAPSULATE
  7.   #include "a.out.encap.h"
  8.   #else
  9.   #include <a.out.h>
  10.   #endif
  11.   
  12.   #ifndef N_SET_MAGIC
  13.   #define N_SET_MAGIC(exec, val)  ((exec).a_magic = val)
  14. --- 27,170 ----
  15.   #include <fcntl.h>
  16.   #endif
  17.   
  18. + #define NO_C_PLUS_PLUS
  19. + #define TARGET_SUN2             2
  20. + #define TARGET_SUN3             3
  21. + #define TARGET_SUN4             4
  22. + #define TARGET_ALTOS            5
  23. + #define TARGET_I386             6   
  24. + #define TARGET_HPUX             7
  25. + #define TARGET_SONY_NEWS        8
  26. + #define TARGET_SEQUENT          9
  27. + #define TARGET_VAX              10
  28. + /*
  29. +  * If `TARGET_MACHINE' was not defined on the compiler command line,
  30. +  * then set it equal to the host machine.
  31. +  */
  32. + #ifndef TARGET_MACHINE
  33. + #if defined(sun) && defined(sparc)
  34. + #define TARGET_MACHINE  TARGET_SUN4
  35. + #endif
  36. + #if defined(sun) && (defined(m68020) || defined(mc68020))
  37. + #define TARGET_MACHINE  TARGET_SUN3
  38. + #endif
  39. + #if defined(sun) && (defined(m68010) || defined(mc68010))
  40. + #define TARGET_MACHINE  TARGET_SUN2
  41. + #endif
  42. + #if defined(ALTOS)
  43. + #define TARGET_MACHINE  TARGET_ALTOS
  44. + #endif
  45. + #if defined(hpux)
  46. + #define TARGET_MACHINE  TARGET_HPUX
  47. + #endif
  48. + #if defined(is386)
  49. + #define TARGET_MACHINE  TARGET_I386
  50. + #endif
  51. + #if defined(sony_news)
  52. + #define TARGET_MACHINE  TARGET_SONY_NEWS
  53. + #endif
  54. + #if defined(sequent)
  55. + #define TARGET_MACHINE  TARGET_SEQUENT
  56. + #endif
  57. + #if defined(is68k) && !defined(TARGET_MACHINE)
  58. + #define TARGET_MACHINE  TARGET_68K
  59. + #endif
  60. + #endif
  61. + #ifndef TARGET_MACHINE
  62. +     CANNOT COMPILE, NO TARGET MACHINE SPECIFIED
  63. + #endif
  64. + #ifndef BIG_ENDIAN
  65. + #define BIG_ENDIAN      4321
  66. + #endif
  67. + #ifndef LITTLE_ENDIAN
  68. + #define LITTLE_ENDIAN   1234
  69. + #endif
  70. + #ifndef PDP_ENDIAN
  71. + /* I think it is unlikely that anybody will try to cross compile
  72. +  * to or from a pdp, so only big-endian and little-endian are supported. */
  73. + #define PDP_ENDIAN   3412
  74. + #endif
  75. + #if TARGET_MACHINE==TARGET_SUN4         || \
  76. +     TARGET_MACHINE==TARGET_SUN3         || \
  77. +     TARGET_MACHINE==TARGET_SUN2         || \
  78. +     TARGET_MACHINE==TARGET_ALTOS        || \
  79. +     TARGET_MACHINE==TARGET_HPUX         || \
  80. +     TARGET_MACHINE==TARGET_SONY_NEWS    || \
  81. +     TARGET_MACHINE==TARGET_68K
  82. + #define TARGET_BYTE_ORDER       BIG_ENDIAN
  83. + #endif
  84. + #if TARGET_MACHINE==TARGET_VAX          || \
  85. +     TARGET_MACHINE==TARGET_I386         || \
  86. +     TARGET_MACHINE==TARGET_SEQUENT
  87. + #define TARGET_BYTE_ORDER       LITTLE_ENDIAN
  88. + #endif
  89. + #if TARGET_MACHINE==TARGET_SUN3
  90. + #define TARGET_PAGE_SIZE    0x2000
  91. + #endif
  92. + #if defined(sparc)      || \
  93. +     defined(m68000)     || \
  94. +     defined(mc68000)    || \
  95. +     defined(m68010)     || \
  96. +     defined(mc68010)    || \
  97. +     defined(m68020)     || \
  98. +     defined(mc68020)    || \
  99. +     defined(is68k)      || \
  100. +     defined(hpux)       || \
  101. +     defined(sony_news)
  102. + #define HOST_BYTE_ORDER     BIG_ENDIAN
  103. + #endif
  104. + #if defined(vax)        || \
  105. +     defined(is386)      || \
  106. +     defined(ds3100)     || \
  107. +     defined(sequent)
  108. + #define HOST_BYTE_ORDER     LITTLE_ENDIAN
  109. + #endif
  110. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  111. + static void fix_byte_order();
  112. + static void fix_exec_header_byte_order();
  113. + static void fix_symbol_byte_order();
  114. + static void target_to_host_reloc_byte_order();
  115. + static void host_to_target_reloc_byte_order();
  116. + static void fix_symbol_root_byte_order();
  117. + #endif
  118.   #ifdef COFF_ENCAPSULATE
  119.   #include "a.out.encap.h"
  120.   #else
  121. + #ifdef sprite
  122. + #if TARGET_MACHINE==TARGET_SUN4
  123. + #include <sun4.md/a.out.h>
  124. + #elif TARGET_MACHINE==TARGET_SUN3
  125. + #include <sun3.md/a.out.h>
  126. + #elif TARGET_MACHINE==TARGET_SEQUENT
  127. + #include <symm.md/a.out.h>
  128. + #else
  129. +     no a.out.h specified
  130. + #endif
  131. + #else
  132.   #include <a.out.h>
  133.   #endif
  134. + #endif
  135. + #ifdef sprite
  136. + #undef NEW_SEG_SIZE
  137. + #if TARGET_MACHINE==TARGET_SUN4
  138. + #define NEW_SEG_SIZE    0x40000
  139. + #endif
  140. + #if TARGET_MACHINE==TARGET_SUN3
  141. + #define NEW_SEG_SIZE    0x20000
  142. + #endif
  143. + #endif  /* sprite */
  144.   
  145.   #ifndef N_SET_MAGIC
  146.   #define N_SET_MAGIC(exec, val)  ((exec).a_magic = val)
  147. ***************
  148. *** 85,91 ****
  149.   
  150.   /* Define this to specify the default executable format.  */
  151.   
  152. ! #ifdef hpux
  153.   #define DEFAULT_MAGIC NMAGIC  /* hpux bugs screw ZMAGIC */
  154.   #endif
  155.   
  156. --- 218,224 ----
  157.   
  158.   /* Define this to specify the default executable format.  */
  159.   
  160. ! #if TARGET_MACHINE==TARGET_HPUX
  161.   #define DEFAULT_MAGIC NMAGIC  /* hpux bugs screw ZMAGIC */
  162.   #endif
  163.   
  164. ***************
  165. *** 96,125 ****
  166.   /* Ordinary 4.3bsd lacks these macros in a.out.h.  */
  167.   
  168.   #ifndef N_TXTADDR
  169. ! #if defined(vax) || defined(sony_news)
  170.   #define N_TXTADDR(X) 0
  171.   #endif
  172. ! #ifdef is68k
  173.   #define N_TXTADDR(x)  (sizeof (struct exec))
  174.   #endif
  175. ! #ifdef sequent
  176.   #define    N_TXTADDR(x) (N_ADDRADJ(x))
  177.   #endif
  178.   #endif
  179.   
  180.   #ifndef N_DATADDR
  181. ! #if defined(vax) || defined(sony_news)
  182.   #define N_DATADDR(x) \
  183.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  184.       : (page_size+((N_TXTADDR(x)+(x).a_text-1) & ~(page_size-1))))
  185.   #endif
  186. ! #ifdef is68k
  187.   #define SEGMENT_SIZE 0x20000
  188.   #define N_DATADDR(x) \
  189. !     (((x).a_magic==Omagic)? (N_TXTADDR(x)+(x).a_text) \
  190.        : (SEGMENT_SIZE + ((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1))))
  191.   #endif
  192. ! #ifdef sequent
  193.   #define N_DATADDR(x) \
  194.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  195.       : (page_size+(((x).a_text-1) & ~(page_size-1))))
  196. --- 229,258 ----
  197.   /* Ordinary 4.3bsd lacks these macros in a.out.h.  */
  198.   
  199.   #ifndef N_TXTADDR
  200. ! #if TARGET_MACHINE==TARGET_VAX || TARGET_MACHINE==TARGET_SONY_NEWS
  201.   #define N_TXTADDR(X) 0
  202.   #endif
  203. ! #if TARGET_MACHINE==TARGET_SUN3 || TARGET_MACHINE==TARGET_SUN2
  204.   #define N_TXTADDR(x)  (sizeof (struct exec))
  205.   #endif
  206. ! #if TARGET_MACHINE==TARGET_SEQUENT
  207.   #define    N_TXTADDR(x) (N_ADDRADJ(x))
  208.   #endif
  209.   #endif
  210.   
  211.   #ifndef N_DATADDR
  212. ! #if TARGET_MACHINE==TARGET_VAX || TARGET_MACHINE==TARGET_SONY_NEWS
  213.   #define N_DATADDR(x) \
  214.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  215.       : (page_size+((N_TXTADDR(x)+(x).a_text-1) & ~(page_size-1))))
  216.   #endif
  217. ! #if TARGET_MACHINE==TARGET_SUN3 || TARGET_MACHINE==TARGET_SUN2
  218.   #define SEGMENT_SIZE 0x20000
  219.   #define N_DATADDR(x) \
  220. !     (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  221.        : (SEGMENT_SIZE + ((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1))))
  222.   #endif
  223. ! #if TARGET_MACHINE==TARGET_SEQUENT
  224.   #define N_DATADDR(x) \
  225.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  226.       : (page_size+(((x).a_text-1) & ~(page_size-1))))
  227. ***************
  228. *** 127,168 ****
  229.   #endif
  230.   
  231.   /* Define how to initialize system-dependent header fields.  */
  232. ! #ifdef sun
  233. ! #ifdef sparc
  234.   #define INITIALIZE_HEADER \
  235.     {outheader.a_machtype = M_SPARC; outheader.a_toolversion = 1;}
  236.   #endif
  237. ! #if defined(mc68010) || defined(m68010)
  238.   #define INITIALIZE_HEADER outheader.a_machtype = M_68010
  239.   #endif
  240. ! #ifndef INITIALIZE_HEADER
  241.   #define INITIALIZE_HEADER outheader.a_machtype = M_68020
  242.   #endif
  243. ! #endif
  244. ! #ifdef ALTOS
  245.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_68020)
  246.   #endif
  247. ! #ifdef is68k
  248. ! #ifdef M_68020
  249. ! /* ISI rel 4.0D doesn't use it, and rel 3.05 doesn't have an
  250. !    a_machtype field and so won't recognize the magic number.  To keep
  251. !    binary compatibility for now, just ignore it */
  252. ! #define INITIALIZE_HEADER outheader.a_machtype = 0;
  253. ! #endif
  254. ! #endif
  255. ! #ifdef hpux
  256.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, HP9000S200_ID)
  257.   #endif
  258. ! #if defined(i386) && !defined(sequent)
  259.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_386)
  260.   #endif
  261. ! #ifdef is68k
  262.   /* This enables code to take care of an ugly hack in the ISI OS.
  263.      If a symbol beings with _$, then the object file is included only
  264.      if the rest of the symbol name has been referenced. */
  265.   #define DOLLAR_KLUDGE
  266.   #endif
  267.   
  268.   /*
  269.    * Alloca include.
  270. --- 260,312 ----
  271.   #endif
  272.   
  273.   /* Define how to initialize system-dependent header fields.  */
  274. ! #if TARGET_MACHINE==TARGET_SUN4
  275.   #define INITIALIZE_HEADER \
  276.     {outheader.a_machtype = M_SPARC; outheader.a_toolversion = 1;}
  277.   #endif
  278. ! #if TARGET_MACHINE==TARGET_SUN2
  279.   #define INITIALIZE_HEADER outheader.a_machtype = M_68010
  280.   #endif
  281. ! #if TARGET_MACHINE==TARGET_SUN3
  282.   #define INITIALIZE_HEADER outheader.a_machtype = M_68020
  283.   #endif
  284. ! #if TARGET_MACHINE==TARGET_ALTOS
  285.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_68020)
  286.   #endif
  287. ! #if TARGET_MACHINE==TARGET_HPUX
  288.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, HP9000S200_ID)
  289.   #endif
  290. ! #if TARGET_MACHINE==TARGET_I386
  291.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_386)
  292.   #endif
  293. ! #if TARGET_MACHINE==TARGET_68K
  294. ! #define INITIALIZE_HEADER outheader.a_machtype = 0;  
  295.   /* This enables code to take care of an ugly hack in the ISI OS.
  296.      If a symbol beings with _$, then the object file is included only
  297.      if the rest of the symbol name has been referenced. */
  298.   #define DOLLAR_KLUDGE
  299.   #endif
  300. + #if TARGET==TARGET_SEQUENT
  301. + /* This is all stuff needed to make standalone binaries */
  302. + static struct gdtbl gdt_filler = {
  303. +     { 0x0000FFFF, 0x00CF9A00 },    /* code entry */
  304. +     { 0x0000FFFF, 0x00CF9200 },    /* data entry */
  305. +     { 0x00180017, 0x00000000 },    /* 6 byte descriptor */
  306. + };
  307. + static char instr[] = {
  308. +     0x67, 0x66, 0x0f, 0x01, 0x15, 0x30, 0x00, 0x00, 0x00,
  309. +     0x0f, 0x20, 0xc3,
  310. +     0x80, 0xcb, 0x01,
  311. +     0x0f, 0x22, 0xc3,
  312. +     0xea, 0x5b, 0x00, 0x08, 0x00,
  313. +     0xbb, 0x10, 0x00, 0x00, 0x00,
  314. +     0x8e, 0xdb,
  315. +     0x8e, 0xd3,
  316. +     0x8e, 0xc3,
  317. +     0xff, 0x25, 0x6c, 0x00, 0x00, 0x00,
  318. +     0x00, 0x00, 0x00, 0x00, };
  319. + #endif   
  320.   
  321.   /*
  322.    * Alloca include.
  323. ***************
  324. *** 319,330 ****
  325.   #define RELOC_MEMORY_SUB_P(r)        0
  326.   #define RELOC_MEMORY_ADD_P(r)           0
  327.   #define RELOC_ADD_EXTRA(r)              ((r)->r_addend)       
  328. ! #define RELOC_PCREL_P(r)             \
  329. !         ((r)->r_type >= RELOC_DISP8 && (r)->r_type <= RELOC_WDISP22)
  330. ! #define RELOC_VALUE_RIGHTSHIFT(r)       (reloc_target_rightshift[(r)->r_type])
  331. ! #define RELOC_TARGET_SIZE(r)            (reloc_target_size[(r)->r_type])
  332.   #define RELOC_TARGET_BITPOS(r)          0
  333. ! #define RELOC_TARGET_BITSIZE(r)         (reloc_target_bitsize[(r)->r_type])
  334.   
  335.   /* Note that these are very dependent on the order of the enums in
  336.      enum reloc_type (in a.out.h); if they change the following must be
  337. --- 463,477 ----
  338.   #define RELOC_MEMORY_SUB_P(r)        0
  339.   #define RELOC_MEMORY_ADD_P(r)           0
  340.   #define RELOC_ADD_EXTRA(r)              ((r)->r_addend)       
  341. ! #define RELOC_PCREL_P(r)                \
  342. !     ((int) (r)->r_type >= (int) RELOC_DISP8 && \
  343. !      (int) (r)->r_type <= (int) RELOC_WDISP22)
  344. ! #define RELOC_VALUE_RIGHTSHIFT(r) \
  345. !     (reloc_target_rightshift[(int) (r)->r_type])
  346. ! #define RELOC_TARGET_SIZE(r)            (reloc_target_size[(int) (r)->r_type])
  347.   #define RELOC_TARGET_BITPOS(r)          0
  348. ! #define RELOC_TARGET_BITSIZE(r) \
  349. !     (reloc_target_bitsize[(int) (r)->r_type])
  350.   
  351.   /* Note that these are very dependent on the order of the enums in
  352.      enum reloc_type (in a.out.h); if they change the following must be
  353. ***************
  354. *** 813,818 ****
  355.      and reduce the size of the bss section to match.  */
  356.   int specified_data_size;
  357.   
  358.   /* Magic number to use for the output file, set by switch.  */
  359.   int magic;
  360.   
  361. --- 974,985 ----
  362.      and reduce the size of the bss section to match.  */
  363.   int specified_data_size;
  364.   
  365. + /* Gap to insert between end of bss and start of data seg */
  366. + int data_gap;
  367. + /* Nonzero if -Z was specified (for data_gap) */
  368. + int Z_flag_specified;
  369.   /* Magic number to use for the output file, set by switch.  */
  370.   int magic;
  371.   
  372. ***************
  373. *** 905,921 ****
  374.   char *concat ();
  375.   char *get_file_name ();
  376.   symbol *getsym (), *getsym_soft ();
  377.   int
  378.   main (argc, argv)
  379.        char **argv;
  380.        int argc;
  381.   {
  382.     page_size = getpagesize ();
  383.     progname = argv[0];
  384.   
  385.     /* Clear the cumulative info on the output file.  */
  386.     text_size = 0;
  387.     data_size = 0;
  388.     bss_size = 0;
  389. --- 1072,1105 ----
  390.   char *concat ();
  391.   char *get_file_name ();
  392.   symbol *getsym (), *getsym_soft ();
  393.   int
  394.   main (argc, argv)
  395.        char **argv;
  396.        int argc;
  397.   {
  398. + /*   Added this to stop ld core-dumping on very large .o files.    */
  399. + #ifdef RLIMIT_STACK
  400. +   /* Get rid of any avoidable limit on stack size.  */
  401. +   {
  402. +       struct rlimit rlim;
  403. +       /* Set the stack limit huge so that alloca does not fail. */
  404. +       getrlimit (RLIMIT_STACK, &rlim);
  405. +       rlim.rlim_cur = rlim.rlim_max;
  406. +       setrlimit (RLIMIT_STACK, &rlim);
  407. +   }
  408. + #endif /* RLIMIT_STACK */
  409. + #ifdef TARGET_PAGE_SIZE
  410. +   page_size = TARGET_PAGE_SIZE;
  411. + #else
  412.     page_size = getpagesize ();
  413. + #endif
  414.     progname = argv[0];
  415.   
  416.     /* Clear the cumulative info on the output file.  */
  417.     text_size = 0;
  418.     data_size = 0;
  419.     bss_size = 0;
  420. ***************
  421. *** 994,999 ****
  422.   
  423.     text_size -= N_TXTOFF (outheader);
  424.   
  425.     if (text_size < 0)
  426.       text_size = 0;
  427.     entry_offset = text_size;
  428. --- 1179,1187 ----
  429.   
  430.     text_size -= N_TXTOFF (outheader);
  431.   
  432. +   if (T_flag_specified)
  433. +       text_size = 0;    /* don't add sizeof(exec) at -T location */
  434.     if (text_size < 0)
  435.       text_size = 0;
  436.     entry_offset = text_size;
  437. ***************
  438. *** 1056,1061 ****
  439.       case 'u':
  440.       case 'V':
  441.       case 'y':
  442.         if (arg[2])
  443.       return 1;
  444.         return 2;
  445. --- 1244,1250 ----
  446.       case 'u':
  447.       case 'V':
  448.       case 'y':
  449. +     case 'Z':
  450.         if (arg[2])
  451.       return 1;
  452.         return 2;
  453. ***************
  454. *** 1072,1077 ****
  455.         if (! strcmp (&arg[2], "data"))
  456.       return 2;
  457.         return 1;
  458.       }
  459.   
  460.     return 1;
  461. --- 1261,1275 ----
  462.         if (! strcmp (&arg[2], "data"))
  463.       return 2;
  464.         return 1;
  465. + #if TARGET==TARGET_SEQUENT      
  466. +       /* k == Symmetry standalone,
  467. +        * p == don't align text/data boundary (for 8K disk bootstraps).
  468. +        */
  469. +    case 'k':
  470. +    case 'p':
  471. +        return 1;
  472. + #endif       
  473.       }
  474.   
  475.     return 1;
  476. ***************
  477. *** 1168,1180 ****
  478.   
  479.     /* Now check some option settings for consistency.  */
  480.   
  481.   #ifdef NMAGIC
  482.     if ((magic == ZMAGIC || magic == NMAGIC)
  483.   #else
  484. !   if ((magic == ZMAGIC)
  485.   #endif
  486.         && (text_start - text_start_alignment) & (page_size - 1))
  487.       fatal ("-T argument not multiple of page size, with sharable output", 0);
  488.   
  489.     /* Append the standard search directories to the user-specified ones.  */
  490.     {
  491. --- 1366,1384 ----
  492.   
  493.     /* Now check some option settings for consistency.  */
  494.   
  495. + #ifndef sprite
  496.   #ifdef NMAGIC
  497.     if ((magic == ZMAGIC || magic == NMAGIC)
  498.   #else
  499. ! #ifdef SMAGIC
  500. !     if ((magic == SMAGIC || magic == ZMAGIC)
  501. ! #else
  502. !     if ((magic == ZMAGIC)
  503. ! #endif /* SMAGIC */
  504.   #endif
  505.         && (text_start - text_start_alignment) & (page_size - 1))
  506.       fatal ("-T argument not multiple of page size, with sharable output", 0);
  507. + #endif
  508.   
  509.     /* Append the standard search directories to the user-specified ones.  */
  510.     {
  511. ***************
  512. *** 1250,1255 ****
  513.       return;
  514.     if (! strcmp (swt + 1, "Ttext"))
  515.       {
  516.         text_start = parse (arg, "%x", "invalid argument to -Ttext");
  517.         T_flag_specified = 1;
  518.         return;
  519. --- 1454,1462 ----
  520.       return;
  521.     if (! strcmp (swt + 1, "Ttext"))
  522.       {
  523. + #ifdef sprite 
  524. +       magic = OMAGIC;
  525. + #endif
  526.         text_start = parse (arg, "%x", "invalid argument to -Ttext");
  527.         T_flag_specified = 1;
  528.         return;
  529. ***************
  530. *** 1290,1296 ****
  531.         add_cmdline_ref (entry_symbol);
  532.         return;
  533.   
  534.       case 'l':
  535.         return;
  536.   
  537.       case 'L':
  538. --- 1497,1518 ----
  539.         add_cmdline_ref (entry_symbol);
  540.         return;
  541.   
  542. + #if TARGET==TARGET_SEQUENT
  543. +     case 'k':
  544. + #ifdef SMAGIC
  545. +       magic = SMAGIC;
  546. + #else
  547. +       fatal("No SMAGIC defined for -k");
  548. + #endif
  549. +       return;
  550. + #endif
  551.       case 'l':
  552. + #ifndef NO_C_PLUS_PLUS
  553. +       /* If linking with libg++, use the C++ demangler. */
  554. +       if (arg != NULL && strcmp (arg, "g++") == 0)
  555. +       demangler = cplus_demangle;
  556. + #endif /* NO_C_PLUS_PLUS */
  557.         return;
  558.   
  559.       case 'L':
  560. ***************
  561. *** 1333,1338 ****
  562.         return;
  563.   
  564.       case 'T':
  565.         text_start = parse (arg, "%x", "invalid argument to -T");
  566.         T_flag_specified = 1;
  567.         return;
  568. --- 1555,1563 ----
  569.         return;
  570.   
  571.       case 'T':
  572. + #ifdef sprite
  573. +       magic = OMAGIC;
  574. + #endif      
  575.         text_start = parse (arg, "%x", "invalid argument to -T");
  576.         T_flag_specified = 1;
  577.         return;
  578. ***************
  579. *** 4288,4294 ****
  580.   
  581.      FUNCTION receives two arguments: the entry, and ARG.  It must be a
  582.      function returning unsigned long (though this can probably be fudged). */
  583.   unsigned long
  584.   check_each_file (function, arg)
  585.        register unsigned long (*function)();
  586. --- 4520,4526 ----
  587.   
  588.      FUNCTION receives two arguments: the entry, and ARG.  It must be a
  589.      function returning unsigned long (though this can probably be fudged). */
  590. ! #if 0
  591.   unsigned long
  592.   check_each_file (function, arg)
  593.        register unsigned long (*function)();
  594. ***************
  595. *** 1493,1499 ****
  596.   
  597.     if (entry->search_dirs_flag)
  598.       {
  599. -       register char **p = search_dirs;
  600.         int i;
  601.   
  602.         for (i = 0; i < n_search_dirs; i++)
  603. --- 1726,1731 ----
  604.   
  605.     if (entry->search_dirs_flag)
  606.       {
  607.         int i;
  608.   
  609.         for (i = 0; i < n_search_dirs; i++)
  610. ***************
  611. *** 1593,1598 ****
  612.     len = read (desc, loc, sizeof (struct exec));
  613.     if (len != sizeof (struct exec))
  614.       fatal_with_file ("failure reading header of ", entry);
  615.     if (N_BADMAG (*loc))
  616.       fatal_with_file ("bad magic number in ", entry);
  617.   
  618. --- 1825,1833 ----
  619.     len = read (desc, loc, sizeof (struct exec));
  620.     if (len != sizeof (struct exec))
  621.       fatal_with_file ("failure reading header of ", entry);
  622. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  623. +   fix_exec_header_byte_order(loc);
  624. + #endif
  625.     if (N_BADMAG (*loc))
  626.       fatal_with_file ("bad magic number in ", entry);
  627.   
  628. ***************
  629. *** 1619,1629 ****
  630.     lseek (desc, N_SYMOFF (entry->header) + entry->starting_offset, 0);
  631.     if (entry->header.a_syms != read (desc, entry->symbols, entry->header.a_syms))
  632.       fatal_with_file ("premature end of file in symbols of ", entry);
  633.     lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
  634.     if (sizeof str_size != read (desc, &str_size, sizeof str_size))
  635.       fatal_with_file ("bad string table size in ", entry);
  636.     entry->string_size = str_size;
  637.   }
  638.   
  639. --- 1854,1868 ----
  640.     lseek (desc, N_SYMOFF (entry->header) + entry->starting_offset, 0);
  641.     if (entry->header.a_syms != read (desc, entry->symbols, entry->header.a_syms))
  642.       fatal_with_file ("premature end of file in symbols of ", entry);
  643. ! #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  644. !   fix_symbol_byte_order(entry->symbols, entry->header.a_syms);
  645. ! #endif
  646.     lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
  647.     if (sizeof str_size != read (desc, &str_size, sizeof str_size))
  648.       fatal_with_file ("bad string table size in ", entry);
  649. ! #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  650. !   fix_byte_order(&str_size, sizeof(str_size));
  651. ! #endif
  652.     entry->string_size = str_size;
  653.   }
  654.   
  655. ***************
  656. *** 1703,1709 ****
  657.     len = read (desc, &hdr, sizeof hdr);
  658.     if (len != sizeof hdr)
  659.       fatal_with_file ("failure reading header of ", entry);
  660.     if (!N_BADMAG (hdr))
  661.       {
  662.         read_entry_symbols (desc, entry);
  663. --- 1942,1950 ----
  664.     len = read (desc, &hdr, sizeof hdr);
  665.     if (len != sizeof hdr)
  666.       fatal_with_file ("failure reading header of ", entry);
  667. ! #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  668. !   fix_exec_header_byte_order(&hdr);
  669. ! #endif
  670.     if (!N_BADMAG (hdr))
  671.       {
  672.         read_entry_symbols (desc, entry);
  673. ***************
  674. *** 1735,1741 ****
  675.     register struct nlist
  676.       *p,
  677.       *end = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  678. -   int lowest_set_vector = -1;
  679.   
  680.     if (trace_files) prline_file_name (entry, stderr);
  681.   
  682. --- 1976,1981 ----
  683.     register struct nlist
  684.       *p,
  685.       *end = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  686.   
  687.     if (trace_files) prline_file_name (entry, stderr);
  688.   
  689. ***************
  690. *** 2179,2185 ****
  691.      all such structs that refer to the same global symbol.
  692.      This chain starts in the `refs' field of the symbol table entry
  693.      and is chained through the `n_name'.  */
  694.   void
  695.   enter_global_ref (nlist_p, name, entry)
  696.        register struct nlist *nlist_p;
  697. --- 2418,2423 ----
  698.      all such structs that refer to the same global symbol.
  699.      This chain starts in the `refs' field of the symbol table entry
  700.      and is chained through the `n_name'.  */
  701.   void
  702.   enter_global_ref (nlist_p, name, entry)
  703.        register struct nlist *nlist_p;
  704. ***************
  705. *** 2232,2239 ****
  706.       {
  707.         /* Indirect symbols value should be modified to point
  708.            a symbol being equivalenced to. */
  709. !       nlist_p->n_value
  710. !         = (unsigned int) getsym ((nlist_p + 1)->n_un.n_strx
  711.                        + entry->strings);
  712.         if ((symbol *) nlist_p->n_value == sp)
  713.           {
  714. --- 2470,2477 ----
  715.       {
  716.         /* Indirect symbols value should be modified to point
  717.            a symbol being equivalenced to. */
  718. !       nlist_p->n_value =
  719. !         (unsigned int) getsym ((nlist_p + 1)->n_un.n_strx
  720.                        + entry->strings);
  721.         if ((symbol *) nlist_p->n_value == sp)
  722.           {
  723. ***************
  724. *** 2703,2709 ****
  725.        potentially want it.  */
  726.         if (type & N_EXT
  727.         && (type != (N_UNDF | N_EXT) || p->n_value
  728. !           
  729.   #ifdef DOLLAR_KLUDGE
  730.              || name[1] == '$'
  731.   #endif
  732. --- 2955,2961 ----
  733.        potentially want it.  */
  734.         if (type & N_EXT
  735.         && (type != (N_UNDF | N_EXT) || p->n_value
  736.   #ifdef DOLLAR_KLUDGE
  737.              || name[1] == '$'
  738.   #endif
  739. ***************
  740. *** 2435,2443 ****
  741.   
  742.   #ifdef NMAGIC
  743.     if (magic == ZMAGIC || magic == NMAGIC)
  744. ! #else
  745.     if (magic == ZMAGIC)
  746. ! #endif
  747.       {
  748.         int text_end = text_size + N_TXTOFF (outheader);
  749.         text_pad = ((text_end + page_size - 1) & (- page_size)) - text_end;
  750. --- 2712,2724 ----
  751.   
  752.   #ifdef NMAGIC
  753.     if (magic == ZMAGIC || magic == NMAGIC)
  754. ! #else /* NMAGIC */
  755. ! #ifdef SMAGIC
  756. !   if (magic == ZMAGIC || magic == SMAGIC)
  757. ! #else /* SMAGIC */
  758.     if (magic == ZMAGIC)
  759. ! #endif /* SMAGIC */
  760. ! #endif /* NMAGIC */
  761.       {
  762.         int text_end = text_size + N_TXTOFF (outheader);
  763.         text_pad = ((text_end + page_size - 1) & (- page_size)) - text_end;
  764. ***************
  765. *** 3776,3785 ****
  766.   
  767.     if (! Tdata_flag_specified)
  768.       data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
  769.     /* Make sure bss starts out aligned as much as anyone can want.  */
  770.   
  771.     data_size = (data_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  772.   
  773.     /* Set up the set element vector */
  774.   
  775. --- 4057,4070 ----
  776.   
  777.     if (! Tdata_flag_specified)
  778.       data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
  779. ! #ifdef foobar
  780.     /* Make sure bss starts out aligned as much as anyone can want.  */
  781.   
  782.     data_size = (data_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  783. + #endif
  784. +   if (Z_flag_specified)
  785. +       data_start += data_gap;
  786.   
  787.     /* Set up the set element vector */
  788.   
  789. ***************
  790. *** 3789,3800 ****
  791.            for each symbol for the length word at the beginning of the
  792.        vector, plus a word for each symbol for a zero at the end of
  793.        the vector (for incremental linking).  */
  794. !       set_sect_size
  795. !     = (2 * set_symbol_count + set_vector_count) * sizeof (unsigned long);
  796.         set_sect_start = data_start + data_size;
  797.         data_size += set_sect_size;
  798.         set_vectors = (unsigned long *) xmalloc (set_sect_size);
  799.         setv_fill_count = 0;
  800.       }
  801.   
  802.     /* Compute start addresses of each file's sections and symbols.  */
  803. --- 4074,4087 ----
  804.            for each symbol for the length word at the beginning of the
  805.        vector, plus a word for each symbol for a zero at the end of
  806.        the vector (for incremental linking).  */
  807. !       set_sect_size =
  808. !         (2 * set_symbol_count + set_vector_count) * sizeof (unsigned long);
  809.         set_sect_start = data_start + data_size;
  810.         data_size += set_sect_size;
  811.         set_vectors = (unsigned long *) xmalloc (set_sect_size);
  812. + #if 1
  813.         setv_fill_count = 0;
  814. + #endif      
  815.       }
  816.   
  817.     /* Compute start addresses of each file's sections and symbols.  */
  818. ***************
  819. *** 3819,3825 ****
  820.       {
  821.         /* For each symbol */
  822.         register struct nlist *p, *next;
  823. !       int defs = 0, com = sp->max_common_size, erred = 0;
  824.         struct nlist *first_definition;
  825.         for (p = sp->refs; p; p = next)
  826.           {
  827. --- 4106,4112 ----
  828.       {
  829.         /* For each symbol */
  830.         register struct nlist *p, *next;
  831. !       int defs = 0, com = sp->max_common_size;
  832.         struct nlist *first_definition;
  833.         for (p = sp->refs; p; p = next)
  834.           {
  835. ***************
  836. *** 3901,3913 ****
  837.            Reverse the vector itself to put it in file order.  */
  838.         if ((sp->defined & ~N_EXT) == N_SETV)
  839.           {
  840. !           unsigned long length_word_index
  841. !         = (sp->value - set_sect_start) / sizeof (unsigned long);
  842.             unsigned long i, tmp;
  843.   
  844. !           set_vectors[length_word_index]
  845. !         = setv_fill_count - 1 - length_word_index;
  846.             /* Reverse the vector.  */
  847.             for (i = 1;
  848.              i < (setv_fill_count - length_word_index - 1) / 2 + 1;
  849. --- 4188,4199 ----
  850.            Reverse the vector itself to put it in file order.  */
  851.         if ((sp->defined & ~N_EXT) == N_SETV)
  852.           {
  853. !           unsigned long length_word_index =
  854. !             (sp->value - set_sect_start) / sizeof (unsigned long);
  855.             unsigned long i, tmp;
  856.   
  857. !           set_vectors[length_word_index] =
  858. !             setv_fill_count - 1 - length_word_index;
  859.             /* Reverse the vector.  */
  860.             for (i = 1;
  861.              i < (setv_fill_count - length_word_index - 1) / 2 + 1;
  862. ***************
  863. *** 3914,3921 ****
  864.              i++)
  865.           {
  866.             tmp = set_vectors[length_word_index + i];
  867. !           set_vectors[length_word_index + i]
  868. !             = set_vectors[setv_fill_count - i];
  869.             set_vectors[setv_fill_count - i] = tmp;
  870.           }
  871.   
  872. --- 4200,4207 ----
  873.              i++)
  874.           {
  875.             tmp = set_vectors[length_word_index + i];
  876. !           set_vectors[length_word_index + i] =
  877. !             set_vectors[setv_fill_count - i];
  878.             set_vectors[setv_fill_count - i] = tmp;
  879.           }
  880.   
  881. ***************
  882. *** 3926,3934 ****
  883.       }
  884.       }
  885.   
  886.     /* Make sure end of bss is aligned as much as anyone can want.  */
  887.   
  888.     bss_size = (bss_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  889.   
  890.     if (end_symbol)        /* These are null if -r.  */
  891.       {
  892. --- 4212,4222 ----
  893.       }
  894.       }
  895.   
  896. + #ifdef foobar
  897.     /* Make sure end of bss is aligned as much as anyone can want.  */
  898.   
  899.     bss_size = (bss_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  900. + #endif
  901.   
  902.     if (end_symbol)        /* These are null if -r.  */
  903.       {
  904. ***************
  905. *** 3942,3950 ****
  906.     if (specified_data_size && specified_data_size > data_size)
  907.       data_pad = specified_data_size - data_size;
  908.   
  909.     if (magic == ZMAGIC)
  910.       data_pad = ((data_pad + data_size + page_size - 1) & (- page_size))
  911. !                - data_size;
  912.   
  913.     bss_size -= data_pad;
  914.     if (bss_size < 0) bss_size = 0;
  915. --- 4230,4242 ----
  916.     if (specified_data_size && specified_data_size > data_size)
  917.       data_pad = specified_data_size - data_size;
  918.   
  919. + #ifdef SMAGIC
  920. +   if (magic == SMAGIC || magic == ZMAGIC)
  921. + #else
  922.     if (magic == ZMAGIC)
  923. + #endif
  924.       data_pad = ((data_pad + data_size + page_size - 1) & (- page_size))
  925. !     - data_size;
  926.   
  927.     bss_size -= data_pad;
  928.     if (bss_size < 0) bss_size = 0;
  929. ***************
  930. *** 4114,4120 ****
  931.   {
  932.     int line;
  933.     char *filename;
  934. !   struct nlist *sym;
  935.   };
  936.   
  937.   void qsort ();
  938. --- 4406,4412 ----
  939.   {
  940.     int line;
  941.     char *filename;
  942. !   struct nlist *Sym;
  943.   };
  944.   
  945.   void qsort ();
  946. ***************
  947. *** 4150,4176 ****
  948.       *next = state_pointer + 1,
  949.       /* Used to store source file */
  950.       *source = state_pointer + 2;
  951. !   struct file_entry *entry = (struct file_entry *) source->sym;
  952.   
  953. !   current->sym = next->sym;
  954.     current->line = next->line;
  955.     current->filename = next->filename;
  956.   
  957. !   while (++(next->sym) < (entry->symbols
  958.                 + entry->header.a_syms/sizeof (struct nlist)))
  959.       {
  960.         /* n_type is a char, and N_SOL, N_EINCL and N_BINCL are > 0x80, so
  961.          * may look negative...therefore, must mask to low bits
  962.          */
  963. !       switch (next->sym->n_type & 0xff) 
  964.       {
  965.       case N_SLINE:
  966.         if (use_data_symbols) continue;
  967. !       next->line = next->sym->n_desc;
  968.         return 1;
  969.       case N_DSLINE:
  970.         if (!use_data_symbols) continue;
  971. !       next->line = next->sym->n_desc;
  972.         return 1;
  973.   #ifdef HAVE_SUN_STABS
  974.       case N_EINCL:
  975. --- 4442,4468 ----
  976.       *next = state_pointer + 1,
  977.       /* Used to store source file */
  978.       *source = state_pointer + 2;
  979. !   struct file_entry *entry = (struct file_entry *) source->Sym;
  980.   
  981. !   current->Sym = next->Sym;
  982.     current->line = next->line;
  983.     current->filename = next->filename;
  984.   
  985. !   while (++(next->Sym) < (entry->symbols
  986.                 + entry->header.a_syms/sizeof (struct nlist)))
  987.       {
  988.         /* n_type is a char, and N_SOL, N_EINCL and N_BINCL are > 0x80, so
  989.          * may look negative...therefore, must mask to low bits
  990.          */
  991. !       switch (next->Sym->n_type & 0xff) 
  992.       {
  993.       case N_SLINE:
  994.         if (use_data_symbols) continue;
  995. !       next->line = next->Sym->n_desc;
  996.         return 1;
  997.       case N_DSLINE:
  998.         if (!use_data_symbols) continue;
  999. !       next->line = next->Sym->n_desc;
  1000.         return 1;
  1001.   #ifdef HAVE_SUN_STABS
  1002.       case N_EINCL:
  1003. ***************
  1004. *** 4178,4196 ****
  1005.         continue;
  1006.   #endif
  1007.       case N_SO:
  1008. !       source->filename = next->sym->n_un.n_strx + entry->strings;
  1009.         source->line++;
  1010.   #ifdef HAVE_SUN_STABS
  1011.       case N_BINCL:
  1012.   #endif
  1013.       case N_SOL:
  1014. !       next->filename
  1015. !         = next->sym->n_un.n_strx + entry->strings;
  1016.       default:
  1017.         continue;
  1018.       }
  1019.       }
  1020. !   next->sym = (struct nlist *) 0;
  1021.     return 0;
  1022.   }
  1023.   
  1024. --- 4470,4488 ----
  1025.         continue;
  1026.   #endif
  1027.       case N_SO:
  1028. !       source->filename = next->Sym->n_un.n_strx + entry->strings;
  1029.         source->line++;
  1030.   #ifdef HAVE_SUN_STABS
  1031.       case N_BINCL:
  1032.   #endif
  1033.       case N_SOL:
  1034. !       next->filename =
  1035. !         next->Sym->n_un.n_strx + entry->strings;
  1036.       default:
  1037.         continue;
  1038.       }
  1039.       }
  1040. !   next->Sym = (struct nlist *) 0;
  1041.     return 0;
  1042.   }
  1043.   
  1044. ***************
  1045. *** 4205,4213 ****
  1046.        struct file_entry *entry;
  1047.   {
  1048.     struct line_debug_entry
  1049. !     *state_pointer
  1050. !       = (struct line_debug_entry *)
  1051. !     xmalloc (3 * sizeof (struct line_debug_entry));
  1052.     register struct line_debug_entry
  1053.       *current = state_pointer,
  1054.       *next = state_pointer + 1,
  1055. --- 4497,4505 ----
  1056.        struct file_entry *entry;
  1057.   {
  1058.     struct line_debug_entry
  1059. !     *state_pointer =
  1060. !         (struct line_debug_entry *)
  1061. !         xmalloc (3 * sizeof (struct line_debug_entry));
  1062.     register struct line_debug_entry
  1063.       *current = state_pointer,
  1064.       *next = state_pointer + 1,
  1065. ***************
  1066. *** 4228,4234 ****
  1067.         /* I believe this translates to "We lose" */
  1068.         current->filename = next->filename = entry->filename;
  1069.         current->line = next->line = -1;
  1070. !       current->sym = next->sym = (struct nlist *) 0;
  1071.         return state_pointer;
  1072.       }
  1073.   
  1074. --- 4520,4526 ----
  1075.         /* I believe this translates to "We lose" */
  1076.         current->filename = next->filename = entry->filename;
  1077.         current->line = next->line = -1;
  1078. !       current->Sym = next->Sym = (struct nlist *) 0;
  1079.         return state_pointer;
  1080.       }
  1081.   
  1082. ***************
  1083. *** 4235,4246 ****
  1084.     next->line = source->line = 0;
  1085.     next->filename = source->filename
  1086.       = (tmp->n_un.n_strx + entry->strings);
  1087. !   source->sym = (struct nlist *) entry;
  1088. !   next->sym = tmp;
  1089.   
  1090.     next_debug_entry (use_data_symbols, state_pointer); /* To setup next */
  1091.   
  1092. !   if (!next->sym)        /* No line numbers for this section; */
  1093.                   /* setup output results as appropriate */
  1094.       {
  1095.         if (source->line)
  1096. --- 4527,4538 ----
  1097.     next->line = source->line = 0;
  1098.     next->filename = source->filename
  1099.       = (tmp->n_un.n_strx + entry->strings);
  1100. !   source->Sym = (struct nlist *) entry;
  1101. !   next->Sym = tmp;
  1102.   
  1103.     next_debug_entry (use_data_symbols, state_pointer); /* To setup next */
  1104.   
  1105. !   if (!next->Sym)        /* No line numbers for this section; */
  1106.                   /* setup output results as appropriate */
  1107.       {
  1108.         if (source->line)
  1109. ***************
  1110. *** 4280,4296 ****
  1111.   
  1112.     int use_data_symbols;
  1113.   
  1114. !   if (next->sym)
  1115. !     use_data_symbols = (next->sym->n_type & N_TYPE) == N_DATA;
  1116.     else
  1117.       return current->line;
  1118.   
  1119.     /* Go back to the beginning if we've already passed it.  */
  1120. !   if (current->sym->n_value > address)
  1121.       {
  1122.         tmp_pointer = init_debug_scan (use_data_symbols,
  1123.                        (struct file_entry *)
  1124. !                      ((state_pointer + 2)->sym));
  1125.         state_pointer[0] = tmp_pointer[0];
  1126.         state_pointer[1] = tmp_pointer[1];
  1127.         state_pointer[2] = tmp_pointer[2];
  1128. --- 4572,4588 ----
  1129.   
  1130.     int use_data_symbols;
  1131.   
  1132. !   if (next->Sym)
  1133. !     use_data_symbols = (next->Sym->n_type & N_TYPE) == N_DATA;
  1134.     else
  1135.       return current->line;
  1136.   
  1137.     /* Go back to the beginning if we've already passed it.  */
  1138. !   if (current->Sym->n_value > address)
  1139.       {
  1140.         tmp_pointer = init_debug_scan (use_data_symbols,
  1141.                        (struct file_entry *)
  1142. !                      ((state_pointer + 2)->Sym));
  1143.         state_pointer[0] = tmp_pointer[0];
  1144.         state_pointer[1] = tmp_pointer[1];
  1145.         state_pointer[2] = tmp_pointer[2];
  1146. ***************
  1147. *** 4298,4308 ****
  1148.       }
  1149.   
  1150.     /* If we're still in a bad way, return -1, meaning invalid line.  */
  1151. !   if (current->sym->n_value > address)
  1152.       return -1;
  1153.   
  1154. !   while (next->sym
  1155. !      && next->sym->n_value <= address
  1156.        && next_debug_entry (use_data_symbols, state_pointer))
  1157.       ;
  1158.     return current->line;
  1159. --- 4590,4600 ----
  1160.       }
  1161.   
  1162.     /* If we're still in a bad way, return -1, meaning invalid line.  */
  1163. !   if (current->Sym->n_value > address)
  1164.       return -1;
  1165.   
  1166. !   while (next->Sym
  1167. !      && next->Sym->n_value <= address
  1168.        && next_debug_entry (use_data_symbols, state_pointer))
  1169.       ;
  1170.     return current->line;
  1171. ***************
  1172. *** 4332,4349 ****
  1173.     struct relocation_info
  1174.       *reloc_start = data_segment ? entry->datarel : entry->textrel,
  1175.       *reloc;
  1176. !   int reloc_size
  1177. !     = ((data_segment ? entry->header.a_drsize : entry->header.a_trsize)
  1178. !        / sizeof (struct relocation_info));
  1179. !   int start_of_segment
  1180. !     = (data_segment ? entry->data_start_address : entry->text_start_address);
  1181.     struct nlist *start_of_syms = entry->symbols;
  1182. !   struct line_debug_entry *state_pointer
  1183. !     = init_debug_scan (data_segment != 0, entry);
  1184.     register struct line_debug_entry
  1185. !     *current = state_pointer,
  1186. !     *next = state_pointer + 1,
  1187. !     *source = state_pointer + 2;
  1188.     /* Assigned to generally static values; should not be written into.  */
  1189.     char *errfmt;
  1190.     /* Assigned to alloca'd values cand copied into; should be freed
  1191. --- 4624,4639 ----
  1192.     struct relocation_info
  1193.       *reloc_start = data_segment ? entry->datarel : entry->textrel,
  1194.       *reloc;
  1195. !   int reloc_size =
  1196. !     (data_segment ? entry->header.a_drsize : entry->header.a_trsize)
  1197. !        / sizeof (struct relocation_info);
  1198. !   int start_of_segment =
  1199. !     (data_segment ? entry->data_start_address : entry->text_start_address);
  1200.     struct nlist *start_of_syms = entry->symbols;
  1201. !   struct line_debug_entry *state_pointer =
  1202. !     init_debug_scan (data_segment != 0, entry);
  1203.     register struct line_debug_entry
  1204. !     *current = state_pointer;
  1205.     /* Assigned to generally static values; should not be written into.  */
  1206.     char *errfmt;
  1207.     /* Assigned to alloca'd values cand copied into; should be freed
  1208. ***************
  1209. *** 4421,4428 ****
  1210.         /* If errfmt == 0, errmsg has already been defined.  */
  1211.         if (errfmt != 0)
  1212.       {
  1213. !       errmsg = (char *) xmalloc (strlen (errfmt) + strlen (g->name) + 1);
  1214. !       sprintf (errmsg, errfmt, g->name, data_segment ? "data" : "text");
  1215.       }
  1216.   
  1217.         address_to_line (RELOC_ADDRESS (reloc) + start_of_segment,
  1218. --- 4711,4724 ----
  1219.         /* If errfmt == 0, errmsg has already been defined.  */
  1220.         if (errfmt != 0)
  1221.       {
  1222. !       char *nm;
  1223. !       if (demangler == NULL || (nm = (*demangler)(g->name)) == NULL)
  1224. !         nm = g->name;
  1225. !       errmsg = (char *) xmalloc (strlen (errfmt) + strlen (nm) + 1);
  1226. !       sprintf (errmsg, errfmt, nm, data_segment ? "data" : "text");
  1227. !       if (nm != g->name)
  1228. !         free (nm);
  1229.       }
  1230.   
  1231.         address_to_line (RELOC_ADDRESS (reloc) + start_of_segment,
  1232. ***************
  1233. *** 4451,4458 ****
  1234.        FILE *outfile;
  1235.   {
  1236.     int number_of_syms = entry->header.a_syms / sizeof (struct nlist);
  1237. !   unsigned char *nlist_bitvector
  1238. !     = (unsigned char *) alloca ((number_of_syms >> 3) + 1);
  1239.     struct line_debug_entry *text_scan, *data_scan;
  1240.     int i;
  1241.     char *errfmt, *file_name;
  1242. --- 4747,4754 ----
  1243.        FILE *outfile;
  1244.   {
  1245.     int number_of_syms = entry->header.a_syms / sizeof (struct nlist);
  1246. !   unsigned char *nlist_bitvector =
  1247. !     (unsigned char *) alloca ((number_of_syms >> 3) + 1);
  1248.     struct line_debug_entry *text_scan, *data_scan;
  1249.     int i;
  1250.     char *errfmt, *file_name;
  1251. ***************
  1252. *** 4530,4536 ****
  1253.       {
  1254.         if (g->undef_refs >= MAX_UREFS_PRINTED)
  1255.           continue;
  1256. !       
  1257.         if (++(g->undef_refs) == MAX_UREFS_PRINTED)
  1258.           errfmt = "More undefined \"%s\" refs follow";
  1259.         else
  1260. --- 4826,4832 ----
  1261.       {
  1262.         if (g->undef_refs >= MAX_UREFS_PRINTED)
  1263.           continue;
  1264.         if (++(g->undef_refs) == MAX_UREFS_PRINTED)
  1265.           errfmt = "More undefined \"%s\" refs follow";
  1266.         else
  1267. ***************
  1268. *** 4553,4559 ****
  1269.       }
  1270.         else
  1271.       continue;
  1272. !       
  1273.         if (line_number == -1)
  1274.       fprintf (outfile, "%s: ", entry->filename);
  1275.         else
  1276. --- 4849,4855 ----
  1277.       }
  1278.         else
  1279.       continue;
  1280.         if (line_number == -1)
  1281.       fprintf (outfile, "%s: ", entry->filename);
  1282.         else
  1283. ***************
  1284. *** 4560,4568 ****
  1285.       fprintf (outfile, "%s:%d: ", file_name, line_number);
  1286.   
  1287.         if (dont_allow_symbol_name)
  1288. !     fprintf (outfile, "%s", errfmt);
  1289.         else
  1290. !     fprintf (outfile, errfmt, g->name);
  1291.   
  1292.         fputc ('\n', outfile);
  1293.       }
  1294. --- 4856,4872 ----
  1295.       fprintf (outfile, "%s:%d: ", file_name, line_number);
  1296.   
  1297.         if (dont_allow_symbol_name)
  1298. !       fprintf (outfile, "%s", errfmt);
  1299.         else
  1300. !       {
  1301. !     char *nm;
  1302. !     if (demangler != NULL && (nm = (*demangler)(g->name)) != NULL)
  1303. !       {
  1304. !         fprintf (outfile, errfmt, nm);
  1305. !         free (nm);
  1306. !       } else
  1307. !         fprintf (outfile, errfmt, g->name);
  1308. !       }
  1309.   
  1310.         fputc ('\n', outfile);
  1311.       }
  1312. ***************
  1313. *** 4587,4593 ****
  1314.       return;
  1315.   
  1316.     each_file (do_file_warnings, outfile);
  1317.     if (list_unresolved_refs || list_multiple_defs)
  1318.       make_executable = 0;
  1319.   }
  1320. --- 4891,4899 ----
  1321.       return;
  1322.   
  1323.     each_file (do_file_warnings, outfile);
  1324. !   if (trace_files)
  1325. !       printf("undefined_global_sym_count= %d, multiple_def_count= %d\n",
  1326. !          undefined_global_sym_count, multiple_def_count);
  1327.     if (list_unresolved_refs || list_multiple_defs)
  1328.       make_executable = 0;
  1329.   }
  1330. ***************
  1331. *** 4640,4647 ****
  1332.   {
  1333.     N_SET_MAGIC (outheader, magic);
  1334.     outheader.a_text = text_size;
  1335. ! #ifdef sequent
  1336.     outheader.a_text += N_ADDRADJ (outheader);
  1337.   #endif
  1338.     outheader.a_data = data_size;
  1339.     outheader.a_bss = bss_size;
  1340. --- 4946,4957 ----
  1341.   {
  1342.     N_SET_MAGIC (outheader, magic);
  1343.     outheader.a_text = text_size;
  1344. !   if (T_flag_specified)
  1345. !       outheader.a_text += text_start;
  1346. ! #if TARGET_MACHINE==TARGET_SEQUENT
  1347.     outheader.a_text += N_ADDRADJ (outheader);
  1348. +   if (entry_symbol == 0)
  1349. +       entry_symbol = getsym("start");
  1350.   #endif
  1351.     outheader.a_data = data_size;
  1352.     outheader.a_bss = bss_size;
  1353. ***************
  1354. *** 4709,4715 ****
  1355.         coffheader.data_start = dp->s_vaddr;
  1356.       }
  1357.   #endif
  1358.   
  1359.   #ifdef INITIALIZE_HEADER
  1360.     INITIALIZE_HEADER;
  1361.   #endif
  1362. --- 5019,5043 ----
  1363.         coffheader.data_start = dp->s_vaddr;
  1364.       }
  1365.   #endif
  1366. + #if TARGET==TARGET_SEQUENT
  1367. +     if (SMAGIC == magic) {
  1368. +     char *target_ptr; 
  1369. +     long n; 
  1370.   
  1371. +     outheader.a_gdtbl = gdt_filler; 
  1372. +     if (sizeof(instr) > sizeof(outheader.a_bootstrap)) {
  1373. +         fatal("a_bootstrap too small for code"); 
  1374. +     } 
  1375. +     n = outheader.a_entry; 
  1376. +     target_ptr = &instr[sizeof(instr) - 4];
  1377. +     target_ptr[0] = n & 0xff; 
  1378. +     target_ptr[1] = (n >> 8) & 0xff; 
  1379. +     target_ptr[2] = (n >> 16) & 0xff; 
  1380. +     target_ptr[3] = (n >> 24) & 0xff; 
  1381. +     bcopy(instr, (char *)outheader.a_bootstrap, sizeof(instr)); 
  1382. +     }
  1383. + #endif
  1384.   #ifdef INITIALIZE_HEADER
  1385.     INITIALIZE_HEADER;
  1386.   #endif
  1387. ***************
  1388. *** 4749,4755 ****
  1389.     if (need_coff_header)
  1390.       mywrite (&coffheader, sizeof coffheader, 1, outdesc);
  1391.   #endif
  1392.     mywrite (&outheader, sizeof (struct exec), 1, outdesc);
  1393.   
  1394.     /* Output whatever padding is required in the executable file
  1395.        between the header and the start of the text.  */
  1396. --- 5077,5089 ----
  1397.     if (need_coff_header)
  1398.       mywrite (&coffheader, sizeof coffheader, 1, outdesc);
  1399.   #endif
  1400. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1401. +   fix_exec_header_byte_order(&outheader);
  1402. + #endif
  1403.     mywrite (&outheader, sizeof (struct exec), 1, outdesc);
  1404. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1405. +   fix_exec_header_byte_order(&outheader);
  1406. + #endif
  1407.   
  1408.     /* Output whatever padding is required in the executable file
  1409.        between the header and the start of the text.  */
  1410. ***************
  1411. *** 4748,4753 ****
  1412.            L_SET);
  1413.         if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  1414.       fatal_with_file ("premature eof in data relocation of ", entry);
  1415.         entry->datarel = reloc;
  1416.       }
  1417.   }
  1418. --- 5091,5100 ----
  1419.            L_SET);
  1420.         if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  1421.       fatal_with_file ("premature eof in data relocation of ", entry);
  1422. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1423. +       target_to_host_reloc_byte_order(reloc,
  1424. +     entry->header.a_drsize/sizeof(*reloc));
  1425. + #endif
  1426.         entry->datarel = reloc;
  1427.       }
  1428.   }
  1429. ***************
  1430. *** 4784,4792 ****
  1431.     else
  1432.       {
  1433.         reloc = (struct relocation_info *) alloca (entry->header.a_trsize);
  1434.         lseek (desc, text_offset (entry) + entry->header.a_text + entry->header.a_data, 0);
  1435.         if (entry->header.a_trsize != read (desc, reloc, entry->header.a_trsize))
  1436.       fatal_with_file ("premature eof in text relocation of ", entry);
  1437.       }
  1438.   
  1439.     /* Read the text section into core.  */
  1440. --- 5131,5148 ----
  1441.     else
  1442.       {
  1443.         reloc = (struct relocation_info *) alloca (entry->header.a_trsize);
  1444. +       if (trace_files)
  1445. +           printf("lseek to 0x%x (t_o= 0x%x, a_t= 0x%x, a_d= 0x%x)\n",
  1446. +              text_offset(entry) + entry->header.a_text +
  1447. +              entry->header.a_data, text_offset(entry),
  1448. +              entry->header.a_text, entry->header.a_data);
  1449.         lseek (desc, text_offset (entry) + entry->header.a_text + entry->header.a_data, 0);
  1450.         if (entry->header.a_trsize != read (desc, reloc, entry->header.a_trsize))
  1451.       fatal_with_file ("premature eof in text relocation of ", entry);
  1452. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1453. +       target_to_host_reloc_byte_order(reloc,
  1454. +       entry->header.a_trsize/sizeof(*reloc));
  1455. + #endif
  1456.       }
  1457.   
  1458.     /* Read the text section into core.  */
  1459. ***************
  1460. *** 3511,3516 ****
  1461.            0);
  1462.         if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  1463.       fatal_with_file ("premature eof in data relocation of ", entry);
  1464.       }
  1465.   
  1466.     lseek (desc, text_offset (entry) + entry->header.a_text, 0);
  1467. --- 3876,3885 ----
  1468.            0);
  1469.         if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  1470.       fatal_with_file ("premature eof in data relocation of ", entry);
  1471. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1472. +       target_to_host_reloc_byte_order(reloc,
  1473. +       entry->header.a_drsize/sizeof(*reloc));
  1474. + #endif
  1475.       }
  1476.   
  1477.     lseek (desc, text_offset (entry) + entry->header.a_text, 0);
  1478. ***************
  1479. *** 3661,3681 ****
  1480.         break;
  1481.   
  1482.       case 1:
  1483.         if (RELOC_MEMORY_SUB_P(p))
  1484. !         relocation -= mask & *(short *) (data + addr);
  1485.         else if (RELOC_MEMORY_ADD_P(p))
  1486. !         relocation += mask & *(short *) (data + addr);
  1487. !       *(short *) (data + addr) &= ~mask;
  1488. !       *(short *) (data + addr) |= relocation;
  1489.         break;
  1490.   
  1491.       case 2:
  1492. !       if (RELOC_MEMORY_SUB_P(p))
  1493. !         relocation -= mask & *(long *) (data + addr);
  1494.         else if (RELOC_MEMORY_ADD_P(p))
  1495. !         relocation += mask & *(long *) (data + addr);
  1496. !       *(long *) (data + addr) &= ~mask;
  1497. !       *(long *) (data + addr) |= relocation;
  1498.         break;
  1499.   
  1500.       default:
  1501. --- 4036,4096 ----
  1502.         break;
  1503.   
  1504.       case 1:
  1505. + #if TARGET_BYTE_ORDER==BIG_ENDIAN
  1506. +       x = ((unsigned char *) (data + addr))[1]
  1507. +        | (((unsigned char *) (data + addr))[0] << 8);
  1508. + #endif
  1509. + #if TARGET_BYTE_ORDER==LITTLE_ENDIAN
  1510. +       x = ((unsigned char *) (data + addr))[0]
  1511. +        | (((unsigned char *) (data + addr))[1] << 8);
  1512. + #endif
  1513.         if (RELOC_MEMORY_SUB_P(p))
  1514. !         relocation -= mask & x;
  1515.         else if (RELOC_MEMORY_ADD_P(p))
  1516. !         relocation += mask & x;
  1517. !       x &= ~mask;
  1518. !       x |= relocation;
  1519. ! #if TARGET_BYTE_ORDER==BIG_ENDIAN
  1520. !       ((unsigned char *) (data + addr))[1] = x;
  1521. !       ((unsigned char *) (data + addr))[0] = x >> 8;
  1522. ! #endif
  1523. ! #if TARGET_BYTE_ORDER==LITTLE_ENDIAN
  1524. !       ((unsigned char *) (data + addr))[0] = x;
  1525. !       ((unsigned char *) (data + addr))[1] = x >> 8;
  1526. ! #endif
  1527.         break;
  1528.   
  1529.       case 2:
  1530. ! #if TARGET_BYTE_ORDER==BIG_ENDIAN
  1531. !       x = ((unsigned char *) (data + addr))[3]
  1532. !        | (((unsigned char *) (data + addr))[2] << 8)
  1533. !        | (((unsigned char *) (data + addr))[1] << 16)
  1534. !        | (((unsigned char *) (data + addr))[0] << 24);
  1535. ! #endif
  1536. ! #if TARGET_BYTE_ORDER==LITTLE_ENDIAN
  1537. !       x = ((unsigned char *) (data + addr))[0]
  1538. !        | (((unsigned char *) (data + addr))[1] << 8)
  1539. !        | (((unsigned char *) (data + addr))[2] << 16)
  1540. !        | (((unsigned char *) (data + addr))[3] << 24);
  1541. ! #endif
  1542. !           if (RELOC_MEMORY_SUB_P(p))
  1543. !         relocation -= mask & x;
  1544.         else if (RELOC_MEMORY_ADD_P(p))
  1545. !         relocation += mask & x;
  1546. !       x &= ~mask;
  1547. !       x |= relocation;
  1548. ! #if TARGET_BYTE_ORDER==BIG_ENDIAN
  1549. !       ((unsigned char *) (data + addr))[3] = x;
  1550. !       ((unsigned char *) (data + addr))[2] = x >> 8;
  1551. !       ((unsigned char *) (data + addr))[1] = x >> 16;
  1552. !       ((unsigned char *) (data + addr))[0] = x >> 24;
  1553. ! #endif
  1554. ! #if TARGET_BYTE_ORDER==LITTLE_ENDIAN
  1555. !       ((unsigned char *) (data + addr))[0] = x;
  1556. !       ((unsigned char *) (data + addr))[1] = x >> 8;
  1557. !       ((unsigned char *) (data + addr))[2] = x >> 16;
  1558. !       ((unsigned char *) (data + addr))[3] = x >> 24;
  1559. ! #endif
  1560.         break;
  1561.   
  1562.       default:
  1563. ***************
  1564. *** 3790,3795 ****
  1565.       }
  1566.         p++;
  1567.       }
  1568.     mywrite (entry->textrel, 1, entry->header.a_trsize, outdesc);
  1569.   }
  1570.   
  1571. --- 4205,4214 ----
  1572.       }
  1573.         p++;
  1574.       }
  1575. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1576. +     host_to_target_reloc_byte_order((struct relocation_info *) entry->textrel,
  1577. +     entry->header.a_trsize/sizeof(struct relocation_info));
  1578. + #endif
  1579.     mywrite (entry->textrel, 1, entry->header.a_trsize, outdesc);
  1580.   }
  1581.   
  1582. ***************
  1583. *** 3849,3854 ****
  1584.       }
  1585.         p++;
  1586.       }
  1587.     mywrite (entry->datarel, 1, entry->header.a_drsize, outdesc);
  1588.   }
  1589.   
  1590. --- 4268,4277 ----
  1591.       }
  1592.         p++;
  1593.       }
  1594. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1595. +     host_to_target_reloc_byte_order((struct relocation_info *) entry->datarel,
  1596. +     entry->header.a_drsize/sizeof(struct relocation_info));
  1597. + #endif
  1598.     mywrite (entry->datarel, 1, entry->header.a_drsize, outdesc);
  1599.   }
  1600.   
  1601. ***************
  1602. *** 4056,4061 ****
  1603.     /* Output the buffer full of `struct nlist's.  */
  1604.   
  1605.     lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  1606.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  1607.     symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  1608.   
  1609. --- 4479,4496 ----
  1610.     /* Output the buffer full of `struct nlist's.  */
  1611.   
  1612.     lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  1613. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1614. +   {
  1615. +     int i;
  1616. +     for (i = 0; i < bufp - buf; ++i)
  1617. +       {
  1618. +         fix_byte_order(&buf[i].n_un.n_name, sizeof(buf->n_un.n_name));
  1619. +     fix_byte_order(&buf[i].n_desc, sizeof(buf->n_desc));
  1620. +     fix_byte_order(&buf[i].n_value, sizeof(buf->n_value));
  1621. +       }
  1622. +   }
  1623. + #endif
  1624.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  1625.     symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  1626.   
  1627. ***************
  1628. *** 4068,4073 ****
  1629.     /* Now the total string table size is known, so write it.
  1630.        We are already positioned at the right place in the file.  */
  1631.   
  1632.     mywrite (&strtab_size, sizeof (int), 1, outdesc);  /* we're at right place */
  1633.   
  1634.     /* Write the strings for the global symbols.  */
  1635. --- 4503,4512 ----
  1636.     /* Now the total string table size is known, so write it.
  1637.        We are already positioned at the right place in the file.  */
  1638.   
  1639. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1640. +   fix_byte_order(&strtab_size, sizeof(strtab_size));
  1641. + #endif
  1642.     mywrite (&strtab_size, sizeof (int), 1, outdesc);  /* we're at right place */
  1643.   
  1644.     /* Write the strings for the global symbols.  */
  1645. ***************
  1646. *** 5595,5600 ****
  1647.     /* All the symbols are now in BUF; write them.  */
  1648.   
  1649.     lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  1650.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  1651.     symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  1652.   
  1653. --- 6038,6055 ----
  1654.     /* All the symbols are now in BUF; write them.  */
  1655.   
  1656.     lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  1657. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1658. +   {
  1659. +     int i;
  1660. +     for (i = 0; i < bufp - buf; ++i)
  1661. +       {
  1662. +     fix_byte_order(&buf[i].n_un.n_name, sizeof(buf->n_un.n_name));
  1663. +     fix_byte_order(&buf[i].n_desc, sizeof(buf->n_desc));
  1664. +     fix_byte_order(&buf[i].n_value, sizeof(buf->n_value));
  1665. +       }
  1666. +   }
  1667. + #endif
  1668.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  1669.     symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  1670.   
  1671.